"""
文件工具类，用于文件操作
"""
import os
import json
import shutil
from typing import Any, Dict, List, Optional


class FileUtils:
    """
    文件工具类，用于文件操作
    """
    
    @staticmethod
    def ensure_dir(directory: str) -> bool:
        """
        确保目录存在，如果不存在则创建
        
        @param directory: 目录路径
        @return: 是否成功创建或目录已存在
        """
        try:
            if not os.path.exists(directory):
                os.makedirs(directory)
            return True
        except Exception:
            return False
    
    @staticmethod
    def read_json(file_path: str) -> Optional[Dict[str, Any]]:
        """
        读取 JSON 文件
        
        @param file_path: 文件路径
        @return: JSON 数据，如果读取失败则返回 None
        """
        try:
            if not os.path.exists(file_path):
                return None
            
            # 使用UTF-8编码读取，确保中文字符正确解析
            with open(file_path, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception as e:
            print(f"读取JSON文件失败: {str(e)}")
            return None
    
    @staticmethod
    def write_json(file_path: str, data: Dict[str, Any]) -> bool:
        """
        写入 JSON 文件
        
        @param file_path: 文件路径
        @param data: 要写入的数据
        @return: 是否写入成功
        """
        try:
            # 确保目录存在
            directory = os.path.dirname(file_path)
            FileUtils.ensure_dir(directory)
            
            # 使用UTF-8编码写入，确保中文字符正确保存
            with open(file_path, 'w', encoding='utf-8') as f:
                json.dump(data, f, ensure_ascii=False, indent=2)
            return True
        except Exception as e:
            print(f"写入JSON文件失败: {str(e)}")
            return False
    
    @staticmethod
    def list_files(directory: str, extension: Optional[str] = None) -> List[str]:
        """
        列出目录中的文件
        
        @param directory: 目录路径
        @param extension: 文件扩展名过滤器，如 '.txt'
        @return: 文件路径列表
        """
        if not os.path.exists(directory) or not os.path.isdir(directory):
            return []
        
        files = []
        for file in os.listdir(directory):
            file_path = os.path.join(directory, file)
            if os.path.isfile(file_path):
                if extension is None or file.endswith(extension):
                    files.append(file_path)
        
        return files
    
    @staticmethod
    def delete_file(file_path: str) -> bool:
        """
        删除文件
        
        @param file_path: 文件路径
        @return: 是否删除成功
        """
        try:
            if os.path.exists(file_path) and os.path.isfile(file_path):
                os.remove(file_path)
                return True
            return False
        except Exception:
            return False
    
    @staticmethod
    def copy_file(src_path: str, dst_path: str) -> bool:
        """
        复制文件
        
        @param src_path: 源文件路径
        @param dst_path: 目标文件路径
        @return: 是否复制成功
        """
        try:
            # 确保目标目录存在
            dst_dir = os.path.dirname(dst_path)
            FileUtils.ensure_dir(dst_dir)
            
            shutil.copy2(src_path, dst_path)
            return True
        except Exception:
            return False 